//package 算法.分治法;
//
///**
// * 在计算机中，长整形（long int）变量的范围是-2147483648至2147483647，<br>
// * 因此若用长整形变量做乘法运算，乘积最多不能超过10位数。<br>
// * 即便用双精度（double）变量，也仅能保证16位有效数字的精度。<br>
// * 在某些需要更高精度的乘法运算场合，需要用别的办法来实现运算。<br>
// * 比较容易想到的是做多位数乘法时列竖式进行计算的方法，只要写出模拟这一过程的程序，<br>
// * 就能实现任意大整数的乘法运算。经过查阅资料，找到一种更易于编程的方法，即“列表法”。<br>
// * 下面先介绍“列表法”:<br>
// * 例如当计算8765*234时，把乘数和被乘数照如下列出：<br>
// * 8 	7 	6 	5 	* <br>
// * 16 	14 	12 	10 	2 <br>
// * 24 	21 	18 	15 	3 <br>
// * 32 	28 	24 	20 	4 <br>
// * ==================================
// * 16	14	12	10				 <br>
// * 		24	21	18	15			 <br>
// * 			32	28	24	20		 <br>
// * 16	38	65	56	39	20		 <br>
// * ==================================
// * 		16		38		65		56		39		20		<br>
// * 	2	16+4=20	38+7=45	65+6=71	56+4=60	39+2=41			<br>
// * 	留2	留0进2	留5进4	留1进7	留0进6	留1进4	留0进2	<br>
// * 	2	0		5		1		0		1		0		<br>
// * 
// * @author Yuanqy
// *
// */
//public class 大整数乘法 {
//	public static void main(String[] args) {
////		System.out.println(Long.MAX_VALUE * Long.MAX_VALUE);
////		System.out.println(92233720368547L * 92233720368547L);
//		
//
//	}
//	
//	int max(int a,int b,int c)  
//	{  
//	  int d = (a >b)?a:b;  
//	  return (d>c)?d:c;  
//	}  
//	int initarray(int a[])  
//	{  
//	   int q,p,i;  
//	   q = N + random(100);  
//	   if(q%3 ==0)  
//	      p =q/3;  
//	   else  
//	      p =q/3+1;  
//	   for(i=0;i <p;i++)  
//	      a[i] = random(1000);  
//	   if(q%3 ==0)  
//	        a[0] = 100+random(900);  
//	   if(q%3 == 2)  
//	       a[0] = 10 + random(90);  
//	   if(q%3 == 1)  
//	       a[0] = 1 + random(9);  
//	   return p;   
//	}  
//	void write(int a[],int l)  
//	{  
//	   int i;  
//	   char string[10];  
//	   for(i=1;i<l;i++)  
//	   {  
//	     itoa(a[i],string,10);  
//	     if(strlen(string)==1)  
//	       fprintf(fp,"00");  
//	     if(strlen(string)==2)  
//	       fprintf(fp,"0");  
//	     fprintf(fp,"%s",string);  
//	     if((i+1)%25 == 0)  
//	        fprintf(fp,"/n");  
//	   }  
//	   fprintf(fp,"/n");  
//	   fprintf(fp,"/n");  
//	}  
//	FILE * fp;  
//	  
//	int main()  
//	{  
////	   int a[5000]={0},b[5000]={0},k[10001]={0};  
//	   unsigned long c,d,e;//申明作累加用的无符号长整数变量  
//	   int i,j,la,lb,ma,mi,p,q,t;  
//	   randomize();//初始化随机数  
//	     
//	  la = initarray(a);//被乘数  
//	  lb = initarray(b);//乘数  
//	    
//	  if(la < lb)//如果被乘数长度小于乘数，则交换被乘数与乘数  
//	  {  
//	    p = (lb > la)?lb:la;  
//	    for(q=0;q<p;q++)  
//	     t=a[q],a[q]=b[q],b[q]=t;  
//	    t =la,la=lb,lb =t;  
//	  }   
//	  c=d=0;  
//	  for(i=la+lb-2;i>=0;i--)//累加斜线间的数，i位横纵坐标之和  
//	  {  
//	    c=d;//将前一位的进位标志存入累加变量C  
//	    ma =max(0,i-la+1,i-lb+1);//求累加的下限  
//	     mi = (i > la)?(la-1):i;//求累加的上限  
//	    for(j=ma;;j<=mi;j++)  
//	    {  
//	       c+=a[j]b[i-j];  
//	    }  
//	    d=c/1000;//求进位标志  
//	    if(c>999)  
//	        c%=1000;//取c的后3位  
//	     k[i] = c;//保存至表示乘积的数组k[]  
//	     
//	  }  
//	  e = k[0] + 1000*d;//求出乘积的最高位  
//	  fp = fopen("res.txt","w+");  
//	  fprintf(fp,"%d",a[0]);//打印被乘数的最高位  
//	  write(a,la);//打印被乘数其他位数  
//	  fprintf(fp,"%d",b[0]);//打印乘数的最高位  
//	  write(b,lb);//打印乘数其他位数  
//	  fprintf(fp,"%d",e);//打印乘积的最高位  
//	  write(k,la+lb-1);//打印乘积其他位数  
//	  fclose(fp);  
//	}  
//}
